#!/bin/sh

GIT_VERSION_FILE=
CEPH_VER_HEADER=
NO_VERSION=0

is_git() {
    type git > /dev/null 2>&1
    if [ $? -ne 0 ]; then
        echo "Could not find git command. Assuming this is not a git repository, not updating .git_version"
        return 1
    fi
    git status > /dev/zero 2>&1;
    if [ $? -ne 0 ]; then
        echo "This is no git repository, not updating .git_version"
        return 1
    else
        return 0
    fi
}

check_gitversion() {
    if is_git; then
        current=`git rev-parse HEAD 2> /dev/null; git describe 2> /dev/null`
        if [ -f $GIT_VERSION_FILE ] ; then
            old=`cat $GIT_VERSION_FILE`

            if [ "$current" != "$old" ]; then
                echo "$current" > $GIT_VERSION_FILE
            fi
        else
            echo "$current" > $GIT_VERSION_FILE
        fi
    fi
}

print_ceph_ver() {
    # print the content of the ceph_ver.h file
    if [ $NO_VERSION -eq 1 ]; then
        ver="no_version"
        ver_nice="Development"
    else
        ver=`head -1 $GIT_VERSION_FILE`
        ver_nice=`tail -1 $GIT_VERSION_FILE | cut -c 2-`
    fi

    echo "#ifndef CEPH_VERSION_H"
    echo "#define CEPH_VERSION_H"
    echo
    echo "#define CEPH_GIT_VER $ver"
    echo "#define CEPH_GIT_NICE_VER \"$ver_nice\""
    echo
    echo "#endif"
}

set_ceph_ver() {
    # compare new and old CEPH_VER_HEADER
    if [ -f $CEPH_VER_HEADER ]; then
	tmpfile=$(mktemp -t "ceph_ver_h.XXXXXXXXXXXXX")
        print_ceph_ver > $tmpfile
        cur_ver=`cat $CEPH_VER_HEADER`
        new_ver=`cat $tmpfile`
        if [ "$cur_ver" != "$new_ver" ]; then
            mv $tmpfile $CEPH_VER_HEADER
	else
	    rm $tmpfile
        fi
    else
        print_ceph_ver > $CEPH_VER_HEADER
    fi
}

usage() {
    printf "usage: $0 -g FILEPATH [options]\n"
    printf "\t-g|--git-version-file\tFILEPATH for git version file (e.g. ./src/.git_version)\n"
    printf "\t-c|--ceph-ver-header\tFILEPATH for ceph version header (e.g. ./src/ceph_ver.h)\n"
    printf "\t-n|--no-version\t\tdon't generate version from git\n"
    printf "\t-h|--help\t\tprint this usage instructions\n"
}

until [ -z "$1" ]; do
case $1 in
    -n|--no-version)
        NO_VERSION=1;
        ;;
    -g|--git-version-file)
        GIT_VERSION_FILE=$2
        shift;
        ;;
    -c|--ceph-ver-header)
        CEPH_VER_HEADER=$2
        shift;
        ;;
    -h|--help)
        usage;
        ;;
    *)
        ;;
esac
shift
done;

if [ -n "$GIT_VERSION_FILE" ] ; then
    if [ -z "$CEPH_VER_HEADER" ] ; then
        check_gitversion
    else
        check_gitversion
        set_ceph_ver
    fi
else
    usage
fi
